#include <REGX52.H>

typedef struct
{
    unsigned char port;
    unsigned char mask;
} GPIO_PIN;

// 定义宏简化引脚的声明，不再调用init_key_config
#define PIN(port, pin_num) {port, (1 << (pin_num))}

#define GET_PORT_DATA(port_num) ((port_num == 0) ? P0 : (port_num == 1) ? P1 \
                                                    : (port_num == 2)   ? P2 \
                                                                        : P3)
#define KEY_PRESSED_NONE 0xFF
/**
 * 将指定的端口，设置指定的数据
 * @param val 0或1  端口的输出电平
 */
void gpio_set(GPIO_PIN pin, bit val)
{
    switch (pin.port)
    {
    case 0:
        if (val)
            P0 |= pin.mask;
        else
            P0 &= ~pin.mask;
        break;
    case 1:
        if (val)
            P1 |= pin.mask;
        else
            P1 &= ~pin.mask;
        break;
    case 2:
        if (val)
            P2 |= pin.mask;
        else
            P2 &= ~pin.mask;
        break;
    case 3:
        if (val)
            P3 |= pin.mask;
        else
            P3 &= ~pin.mask;
        break;
    }
}

bit gpio_get(GPIO_PIN pin)
{
    switch (pin.port)
    {
    case 0:
        return (P0 & pin.mask) ? 1 : 0;
    case 1:
        return (P1 & pin.mask) ? 1 : 0;
    case 2:
        return (P2 & pin.mask) ? 1 : 0;
    case 3:
        return (P3 & pin.mask) ? 1 : 0;
    }
    return 0;
}

void gpio_revert(GPIO_PIN pin)
{
    switch (pin.port)
    {
    case 0:
        P0 ^= pin.mask;
        break;
    case 1:
        P1 ^= pin.mask;
        break;
    case 2:
        P2 ^= pin.mask;
        break;
    case 3:
        P3 ^= pin.mask;
        break;
    default:
        break;
    }
}

unsigned char key_scan(GPIO_PIN gpio_keys[], unsigned int length)
{
    unsigned int i;
    for (i = 0; i < length; i++)
    {
        if (gpio_get(gpio_keys[i]) == 0)
        {
            while (gpio_get(gpio_keys[i]) == 0)
            {
            }
            return i;
        }
    }
    return KEY_PRESSED_NONE;
}